//
//  EmotionController.swift
//  EmotionKeyBoard--01
//
//  Created by FelixYin on 15/7/7.
//  Copyright © 2015年 felixios. All rights reserved.
//

import UIKit

class EmotionController: UIViewController {
    
    //保存更新回调
    
   private var finishedBack:(finished:EmotionIcon) -> Void

    
    
//    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?,finished:(emotionIcon:EmotionIcon) -> Void) {
//        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
//        
//        self.finishedBack = finished
//        
//        print("创建控制器是调用此方法")
//        
//    }
    
    //重写创建控制器的方法
    
    init(finished:(emotionIcon:EmotionIcon) -> Void){
    
       print("创建控制器是调用此方法")
        
       self.finishedBack = finished
       
       super.init(nibName: nil, bundle: nil)
    
    }
    

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
        
        
        view.backgroundColor = UIColor.clearColor()
        
        
        //添加子控件
        view.addSubview(collectionV)
        
        view.addSubview(toolB)
        
        
        //将控件的autoReleasizing取消
        
        collectionV.translatesAutoresizingMaskIntoConstraints = false
        
        toolB.translatesAutoresizingMaskIntoConstraints = false
        
        
        //设置控件的约束
        let viewDict = ["toolBar":toolB,"collectionView":collectionV]
        
        var cons = [NSLayoutConstraint] ()
        
        
        //使用+＝方便，美观
        cons += NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[toolBar]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewDict)
        
        cons += NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[collectionView]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewDict)
        
        cons += NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[collectionView]-0-[toolBar(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewDict)
        
        //将约束添加到父视图
        view.addConstraints(cons)
        
        
        
        print(__FUNCTION__)
        
        
        //为子控件的内容做准备
        
        prepareToolBar()
        
        
        prepareCollectionView()
        
        
        print("collectionViewFrame----\(collectionV.frame)")
        
        
        
        
        
        
    }
    
    
    
    //只要控制器没有显示，下面的生命周期函数不会被调用，伴随而来的是子控件没有大小，也符合苹果的特点
    
    override func viewWillAppear(animated: Bool) {
        print(__FUNCTION__)
        
        print("collectionViewFrame----\(collectionV.frame)")
    }
    
    
    override func viewWillLayoutSubviews() {
        print(__FUNCTION__)
        
        print("collectionViewFrame----\(collectionV.frame)")
    }
    
    
    //此函数中collectionView的大小已经确定，但是此方法调用频率高，不建议在此处实现collectionView布局参数
    
    //最好的方式是，自定义一个UICollectionViewFlowLayout，重写prepareLayout方法
    
    override func viewDidLayoutSubviews() {
        print(__FUNCTION__)
        
        print("collectionViewFrame----\(collectionV.frame)")
    }
    
    
    //默认滚动到第二组
    
    private func defaultSection () -> Void {
    
       collectionV.scrollToItemAtIndexPath(NSIndexPath(forItem: 0, inSection: 1), atScrollPosition: UICollectionViewScrollPosition.Left, animated: false)
      
    }
    
    //默认显示第二组
    override func viewDidAppear(animated: Bool) {
        defaultSection()
    }
    
    
    
    //MARK:准备inputView附带的子视图
    
    private func prepareCollectionView () -> Void {
        
        print(__FUNCTION__)
        
        
        collectionV.dataSource = self
        
        collectionV.delegate = self
        
        collectionV.pagingEnabled = true
        
        //collectionView默认的颜色为黑色...
        
        collectionV.backgroundColor = UIColor.clearColor()
        
        collectionV.showsHorizontalScrollIndicator = false
        
        //在注册cell的时候，collectionView不会立刻创建cell，当在使用的时候创建（在数据源函数里创建）
        collectionV.registerClass(EmotionIconCell.self, forCellWithReuseIdentifier: "EmotionCell")
        
        
    }
    
    
    private func prepareToolBar () -> Void {
        
        print(__FUNCTION__)
        
        //let array:[String] = ["最近","Emoji","小浪花","经典"]
        
        var barItems = [UIBarButtonItem] ()
        
        var index = 0
        
        for item in emotionIconPackge {
            
            let bItem = UIBarButtonItem(title: item.group_name, style: UIBarButtonItemStyle.Plain, target: self , action: "didSelectedEmotionItem:")
            
            bItem.tag = index
         
            barItems.append(bItem)
            
            index++
            
            barItems.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil))
        
        }
        
        barItems.removeLast()
        
        toolB.items = barItems
        
        //设置toolBar的外表色
        
        toolB.backgroundColor = UIColor.darkGrayColor()
        
    }
    
    
    func  didSelectedEmotionItem (item:UIBarButtonItem) -> Void {
    
    
         print("item-tag:\(item.tag)")
        
         //从选中组的第一个item开始
        
         let indxePath = NSIndexPath(forItem: 0, inSection: item.tag)
        
        //水平最左显示cell
        
         collectionV.scrollToItemAtIndexPath(indxePath, atScrollPosition: UICollectionViewScrollPosition.Left, animated: true)
    
    }
    
    
    //MARK: 子类属性的懒加载
    
    lazy private var toolB:UIToolbar = UIToolbar()
    
    
    lazy private var collectionV:UICollectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: EmotionLayout())
    
    
    lazy private var emotionIconPackge:[EmotionIconPackge] = EmotionIconPackge.emotionIconPackge()
    
    
    
    
    
    
    
   //MARK: 创建私有的collectioView的布局方式
    
    private class EmotionLayout:UICollectionViewFlowLayout{
      
        
        //重写次函数，发现懒加载先加载。。。。不是使用的时候才加载,挺特殊，，，，在viewDidLoad之前就调用了
        override init() {
            super.init()
            
            print(__FUNCTION__+"-------EmotionLayout")
            
        }

        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    
       //重写prepare函数，此函数被调用的时间在  调用完viewDidLayoutSubviews---->本类的prepareLayout----->接着调用collectionView的数据源
    
        //的代理方法 ----> collectionView(_:numberOfItemsInSection:) -----> collectionView(_:cellForItemAtIndexPath:) ---->
        
        //创建自定义的cell
        
        
        //还需要注意一点是：UICollectionViewFlowLayout  继承自 UICollectionViewLayout,父类中包含了一个属性collectionView（需要布局的collectionView）
        
        private override func prepareLayout() {
            
            super.prepareLayout()
            
            
            print(__FUNCTION__)
            
            //计算每一个item的大小，也就是每一个cell的大小
            
            let s = collectionView!.bounds.width / 7
            
            self.itemSize = CGSize(width: s, height: s)
            
            //设置每组中元素之间的间距
            
            self.minimumInteritemSpacing = 0
            
            self.minimumLineSpacing = 0
            
            //设置每组的上下左右边距(乘0.45的原因是由于在不同设备上精度不同)
            
            //这样设置完之后，好看一些，item都向中间靠拢
            
            let y = (collectionView!.bounds.height - 3 * s) * 0.45
            
            self.sectionInset = UIEdgeInsets(top: y, left: 0, bottom: y, right: 0)
            
            //设置滚动方向
            
            self.scrollDirection = UICollectionViewScrollDirection.Horizontal
        
            
            
        }
    
    }

}







extension EmotionController:UICollectionViewDataSource,UICollectionViewDelegate {
    
    
    //MARK: EmotionController分类实现代理方法
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return emotionIconPackge.count ?? 0
    }
    
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        print(__FUNCTION__)
        
        return emotionIconPackge[section].emotionIcons?.count ?? 0
    }
    
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        print(__FUNCTION__)
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("EmotionCell", forIndexPath: indexPath) as! EmotionIconCell
        
        
//        cell.backgroundColor = indexPath.item % 2 == 0 ? UIColor.redColor() : UIColor.blueColor()
        
        //设置数据模型
        
        cell.emotionIcon = emotionIconPackge[indexPath.section].emotionIcons![indexPath.item]
        
        
        return cell
        
        
    }
    
    //TODO:最近表情有一个bug
    
    //在此处更新textView的文本内容(最近表情有一个bug，当连续使用最近组中的同一个表情时出现错乱)
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        
        print(__FUNCTION__)
        
        
        //当使用的是“最近”组表情的出现错乱的原因是，最近表情包数据与页面显示的不一致（需要改进更新最近表情的时间，不能立刻更新）
        
        let e = emotionIconPackge[indexPath.section].emotionIcons![indexPath.item]
        
        
        //回调之前将使用的表情添加到“最近”组
        
        if e.chs != nil || e.emoji != nil {
            
           //记录表情的使用次数
            
           e.times++
        
            //调用表情包的函数
            
           self.emotionIconPackge[0].addMyFavoriteEmotionIcon(e)
        
        }
        
        //当使用的是最近表情组，应该刷新数据（虽然解决了错乱的问题，但是出现瞬闪现象）
        
        if indexPath.section == 0 {
            
          let sections = NSIndexSet(index: indexPath.section)
        
           collectionView.reloadSections(sections)
        
        }
        
        //完成回调
        
        finishedBack(finished: e)
        
    }
    
    
    
    
    
    
}


//MARK: 建立私有的collctionViewCell


private class EmotionIconCell:UICollectionViewCell {

    override init(frame: CGRect) {
        super.init(frame: frame)
        
        
        
        print(__FUNCTION__)
        
        self.addSubview(iconBtn)
        
        iconBtn.frame = CGRectInset(self.bounds, 4, 4)
        
        iconBtn.backgroundColor = UIColor.clearColor()
    
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    
    //懒加载
    
    private lazy var iconBtn:UIButton = UIButton()
    
    
    //设置数据源
    
    var emotionIcon:EmotionIcon?{
    
        didSet{
            
            //设置按钮为禁用状态
            
           iconBtn.userInteractionEnabled = false
            
            
            //注意点是，setTitle与UIImage这能显示其中之一，所以在不使用时需要清空
            
            if let path = emotionIcon?.pngURL {
        
           iconBtn.setImage(UIImage(named: path), forState: UIControlState.Normal)
                
            }else{
            
            //在cell重用时，这一句很实用（重用之前清空一下）
                
            iconBtn.setImage(nil, forState: UIControlState.Normal)
                
            }
            
            
            //如果emoji不为空的话，设置setTitle,不存在时需要给一个空字符串
            
            iconBtn.setTitle(emotionIcon?.emoji ?? "", forState: UIControlState.Normal)
            
            
            //如果是删除表情
            
            if emotionIcon!.isRemoveBtn {
            
                iconBtn.setImage(UIImage(named: "compose_emotion_delete"), forState: UIControlState.Normal)
                
                iconBtn.setImage(UIImage(named: "compose_emotion_delete_highlighted"), forState: UIControlState.Highlighted)
                
                //按照一般的做法是，会想按钮添加点击事件，但是在此处添加点击事件，实现删除功能不是特别好...只要把此按钮当成表情即可
            
            }
        
        }
    
    }




}

